package _go

/*23. 合并K个升序链表
难度
困难

1267

收藏

分享
切换为英文
接收动态
反馈
给你一个链表数组，每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中，返回合并后的链表。



示例 1：

输入：lists = [[1,4,5],[1,3,4],[2,6]]
输出：[1,1,2,3,4,4,5,6]
解释：链表数组如下：
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2：

输入：lists = []
输出：[]
示例 3：

输入：lists = [[]]
输出：[]
*/
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeKLists(lists []*ListNode) *ListNode {
	//链表个数
	l := len(lists)
	return merge(lists, 0, l-1)
}

//分治法  归并   两两合并 最后在合并
func merge(lists []*ListNode, l, r int) *ListNode {
	if l == r {
		return lists[l]
	}
	if l > r {
		return nil
	}
	min := l + (r-l)/2
	return mergeTwoLists(merge(lists, l, min), merge(lists, min+1, r))
}

//合并两个链表
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
	if l1 == nil {
		return l2
	}
	if l2 == nil {
		return l1
	}

	next := &ListNode{}
	res := next

	for l1 != nil && l2 != nil {
		if l1.Val >= l2.Val {
			next.Next = l2
			l2 = l2.Next
		} else {
			next.Next = l1
			l1 = l1.Next
		}
		next = next.Next
	}
	if l1 != nil {
		next.Next = l1
	} else {
		next.Next = l2
	}
	return res.Next
}
